#define _XOPEN_SOURCE 700

#include <stdio.h>
#include <stdlib.h>
#include <signal.h> // 包含sigaction结构体的定义
#include <string.h> // 用于memset函数
#include <unistd.h>

// 自定义信号处理函数
void sigcb(int signum) {
    printf("Received signal: %d\n", signum);
    // 注意：在实际应用中，通常不建议在信号处理函数中调用非异步信号安全的函数，
    // 如printf。这里只是为了演示目的。在生产代码中，你可能希望使用更安全的方法，
    // 如写入一个全局变量并由主循环打印，或者使用syslog等。
}

int main() {
    struct sigaction sa;

    // 清零sigaction结构体
    memset(&sa, 0, sizeof(sa));

    // 设置信号处理函数
    sa.sa_handler = sigcb;

    // 设置sigemptyset以清空信号集
    sigemptyset(&sa.sa_mask);

    // 设置sa_flags为0，表示使用默认行为
    sa.sa_flags = 0;

    // 注册SIGINT信号的处理函数
    if (sigaction(SIGINT, &sa, NULL) == -1) {
        perror("sigaction");
        exit(EXIT_FAILURE);
    }

    // 无限循环，等待信号到来
    while (1) {
        pause(); // 暂停进程，直到接收到信号
    }

    // 注意：由于我们在信号处理函数中调用了exit，这行代码实际上不会被执行。
    return 0;
}